require('es6-promise').polyfill();

import Vue from 'vue'
import Q from 'q'

import axios from 'axios'
import FastClick from './lib/fastclick'
import env from '../env'
import { sync } from 'vuex-router-sync'
import store from './store'
import router from './router'
import data from './dev/data'


import bbPlugin from './lib/vue-bb-plugin'
import ddPlugin from './lib/vue-dd-plugin'
import App from './App'
import filters from './filters'

import {getRequestId, S} from './lib/backend'

import { LoadingPlugin } from 'vux'
Vue.use(LoadingPlugin)

console.debug('==========================================================debugstart==========================================================')

// console.log(FastClick)
// 实例化过滤器

Object.keys(filters).forEach(k => Vue.filter(k, filters[k]));

window.getParamByName = function(name) {
  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  var r = window.location.search.substr(1).match(reg);
  if (r != null) return unescape(r[2]); return null;
};

window.getNoneHashUrl = function(url) {
  return url.split('#')[0];
}

Vue.config.debug = process.env.NODE_ENV !== 'production';
Vue.config.devtools = process.env.NODE_ENV !== 'production';

let dd = window.dd;
const commit = store.commit || store.dispatch;

let ddConfig = null;

getConfig()
  .then((data)=>{
    ddConfig = data;
    // dd.config(ddConfig);
  })
  .catch((err)=>{
    console.log('getConfig', err);
  })
  .finally(()=>{
    //开发环境
    ddIsReady()
      .then(initVue)
      .then(getRequestAuthCode)
      .then(login)
      .then(()=>{

        if(ddConfig != null){
          commit('DDCONFIG_SUCCESS', ddConfig)
        }else{
          commit('DDCONFIG_ERROR', false);
        }

        console.log(store, 'store')

        sync(store, router)

        const app = new Vue({
          router,
          store,
          ...App
        })

        Vue.config.productionTip = false

        /* eslint-disable no-new */

        app.$mount('#app-box')

        FastClick.attach(document.body)

        console.log('init vue 完成 FastClick 加载成功 ')

      })
  })


function getConfig() {

  return Q.Promise((success, error)=>{

    let url = getNoneHashUrl(document.URL);

    console.log('document.URL, wwwwww'+ url)

    // axios.get(env.API_HOST+'/getConfig.php', {params: {paramUrl: url},timeout: 2000,}).then(function (response) {
    // if(response.status == 200 && response.data.code == 200){
    //   let res = response.data.result;

    axios.get(env.CRM_API_HOST+'/dd_config?url='+url).then(function (response) {
      if(response.status == 200 && response.data.errcode == 0){
        let res = response.data.results;

        let ddConfig = {
          agentId: res.agentId, // 必填，微应用ID
          corpId: res.corpId,//必填，企业ID
          timeStamp: res.timeStamp, // 必填，生成签名的时间戳
          nonceStr: res.nonceStr, // 必填，生成签名的随机串
          signature: res.signature, // 必填，签名
          type:0,   //选填。0表示微应用的jsapi,1表示服务窗的jsapi。不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
          jsApiList : [
            'runtime.info',
            'runtime.permission.requestAuthCode',
            'runtime.permission.requestOperateAuthCode', //反馈式操作临时授权码

            'biz.alipay.pay',
            'biz.contact.choose',
            'biz.contact.complexChoose',
            'biz.contact.complexPicker',
            'biz.contact.createGroup',
            'biz.customContact.choose',
            'biz.customContact.multipleChoose',
            'biz.ding.post',
            'biz.map.locate',
            'biz.map.view',
            'biz.util.openLink',
            'biz.util.open',
            'biz.util.share',
            'biz.util.ut',
            'biz.util.uploadImage',
            'biz.util.previewImage',
            'biz.util.datepicker',
            'biz.util.timepicker',
            'biz.util.datetimepicker',
            'biz.util.chosen',
            'biz.util.encrypt',
            'biz.util.decrypt',
            'biz.chat.pickConversation',
            'biz.telephone.call',
            'biz.navigation.setLeft',
            'biz.navigation.setTitle',
            'biz.navigation.setIcon',
            'biz.navigation.close',
            'biz.navigation.setRight',
            'biz.navigation.setMenu',
            'biz.user.get',

            'ui.progressBar.setColors',

            'device.base.getInterface',
            'device.connection.getNetworkType',
            'device.launcher.checkInstalledApps',
            'device.launcher.launchApp',
            'device.notification.confirm',
            'device.notification.alert',
            'device.notification.prompt',
            'device.notification.showPreloader',
            'device.notification.hidePreloader',
            'device.notification.toast',
            'device.notification.actionSheet',
            'device.notification.modal',
            'device.geolocation.get',

            'biz.contact.externalComplexPicker'

          ] // 必填，需要使用的jsapi列表，注意：不要带dd。
        }

        success(ddConfig)
      }else{
        error({errCode:-2,msg:'接口请求失败222'})
      }

    }).catch(function (err) {

      error({errCode:-2,msg:'接口请求失2败'})
    });


  })

}


function ddIsReady() {
  return Q.Promise((success, error)=>{

    let timeout = setTimeout(()=>{
      error({errCode:-1,msg:'dd.ready初始化超时'});
    },2000)

    success(true)

    // dd.ready(function () {
    //   console.log('初始化钉钉');
    //   clearTimeout(timeout)
    //
    //   //获取容器信息
    //   dd.runtime.info({
    //     onSuccess: function(result) {
    //       window.ability = parseInt(result.ability.replace(/\./g,''));
    //       console.log('容器版本为'+window.ability)
    //
    //       dd.biz.navigation.setTitle({
    //         title: "全优加CRM",//标题
    //         onSuccess : function(result) {
    //           /**/
    //         },
    //         onFail : function() {}
    //       })
    //
    //       //设置返回按钮
    //       dd.biz.navigation.setLeft({
    //         show: true,//控制按钮显示， true 显示， false 隐藏， 默认true
    //         control: true,//是否控制点击事件，true 控制，false 不控制， 默认false
    //         showIcon: true,//是否显示icon，true 显示， false 不显示，默认true； 注：具体UI以客户端为准
    //         text: '返回',//控制显示文本，空字符串表示显示默认文本
    //         onSuccess : function(result) {
    //           //如果control为true，则onSuccess将在发生按钮点击事件被回调
    //           console.log('点击了返回按钮');
    //           window.history.back();
    //         },
    //         onFail : function(err) {}
    //       });
    //
    //     },
    //     onFail : function(err) {}
    //   })
    //
    //   success(true)
    // });
    //
    // dd.error(function(err){
    //   clearTimeout(timeout)
    //   /**
    //    {
    //     message:"错误信息",//message信息会展示出钉钉服务端生成签名使用的参数，请和您生成签名的参数作对比，找出错误的参数
    //     errorCode:"错误码"
    //    }
    //    **/
    //    console.error('dd error: ', err.message, err, ddConfig);
    //
    //   error({errCode:-1,msg:'dd.error配置信息不对'})
    // });
  })
}

//获取请求授权码
function getRequestAuthCode() {

  return Q.Promise((success, error)=>{
    console.log('ssss')
    ddConfig.authCode = '6308453be0af325b96296aea794c9f4b';
    success(true);

    // dd.runtime.permission.requestAuthCode({
    //   corpId: ddConfig.corpId,
    //   onSuccess: function(result) {
    //     ddConfig.authCode = result.code;
    //     success();
    //   },
    //   onFail : function(err) {
    //     console.error(JSON.stringify(err), 'failed', 'ddConfig.corpId:'+ddConfig.corpId)
    //     error({errCode:-1,msg:'dd.error配置信息不对'})
    //   }
    // });

  });
}


function login() {
  console.log('ww')
  return Q.Promise((success, error)=>{

    console.log(ddConfig.authCode, 'ddConfig.authCode ')

    let params = S({
      "trace": {
      "requestId": getRequestId()
      },
      "info": {
      "code": ddConfig.authCode
      }
    });

    initLoginUser(data.token);

    console.debug(params);

    // axios.post(env.CRM_API_HOST+'/ding/login', params).then(function (response) {
    //
    //   if(response.status == 200 && response.data.errcode == 0){
    //     let res = response.data.results;
    //     commit('UPDATE_TOKEN', res.token)
    //     initLoginUser(res.token);
    //     success();
    //   } else {
    //     error({errCode:-2,msg:'接口请求失2败'})
    //   }
    //
    // }).catch(function (err) {
    //   console.error(err);
    //   error({errCode:-2,msg:'接口请求失2败'})
    // });

    commit('UPDATE_TOKEN', data.token)
    success();

  });
}

function initLoginUser(token){

  return Q.Promise((success, error)=>{

  axios.get(env.CRM_API_HOST+'/users/'+token).then(function (response) {

    if(response.status == 200 && response.data.errcode == 0){
      let res = response.data.results;
      commit('UPDATE_USER', res)
      success();
    } else {
      error({errCode:-2,msg:'接口请求失2败'})
    }

  }).catch(function (err) {
    console.error(err);
    error({errCode:-2,msg:'接口请求失2败'})
  });

  });
}

function initVue() {

  return Q.Promise((success, error)=>{

    Vue.use(bbPlugin)
    Vue.use(ddPlugin)

    // let router = new Router({
    //   transitionOnLoad: false
    // })
    //
    // // router.redirect({
    // //   '*': env.BASE_PATH
    // // });
    // let history = window.sessionStorage
    // history.clear()
    // let historyCount = history.getItem('count') * 1 || 0
    // history.setItem('/', 0)
    //
    // router.beforeEach(({ to, from, next }) => {
    //   const toIndex = history.getItem(to.path)
    //   const fromIndex = history.getItem(from.path)
    //   if (toIndex) {
    //     if (toIndex > fromIndex || !fromIndex) {
    //       commit('UPDATE_DIRECTION', 'forward')
    //     } else {
    //       commit('UPDATE_DIRECTION', 'reverse')
    //     }
    //   } else {
    //     ++historyCount
    //     history.setItem('count', historyCount)
    //     to.path !== '/' && history.setItem(to.path, historyCount)
    //     commit('UPDATE_DIRECTION', 'forward')
    //   }
    //   commit('UPDATE_LOADING', true)
    //
    //
    //   setTimeout(()=>{
    //     try {
    //       //设置右侧按钮
    //       dd.biz.navigation.setRight({
    //         show: false,//控制按钮显示， true 显示， false 隐藏， 默认true
    //       });
    //     }catch (err){
    //       console.error(err);
    //     }
    //
    //     next();
    //   }, 10)
    // })
    // router.afterEach(() => {
    //   commit('UPDATE_LOADING', false)
    // })
    // sync(store, router)
    // router.start(App, '#app')

    // FastClick.attach(document.body)

    success()

  }).catch(function (err) {
    console.log(err,2)
  });
}
